#include "folder.h"

using namespace std;

Folder::Folder()
{

}

Message::Message(const Message &m) :
    contents(m.contents), folders(m.folders)
{
    add_to_Folders(m);  // 将本消息添加到指向 m 的 Folder 中
}

Message &Message::operator =(const Message &rhs)
{
    // 通过先删除指针再插入它们来处理自赋值情况
    remove_from_folders();      // 更新已有的 Folder
    contents = rhs.contents;    // 从 rhs 拷贝消息内容
    folders = rhs.folders;      // 从 rhs 拷贝 Folder 指针
    add_to_Folders(rhs);        // 将本 Message 添加到哪些 Folder 中
    return *this;
}

Message::~Message()
{
    remove_from_folders();
}

void Message::save(Folder &f)
{
    folders.insert(&f); // 将给定 Folder 添加到我们的 Folder 列表中
    f.addMsg(this);     // 将本 Message 添加到 f 的 Message 集合中
}

void Message::remove(Folder &f)
{
    folders.erase(&f);  // 将给定 Folder 从我们的 Folder 列表中删除
    f.remMsg(this);     // 将本 Message 从 f 的 Message 集合中删除
}

// 将本 Message 添加到指向 m 的 Folder 中
void Message::add_to_Folders(const Message &m)
{
    for (auto f : m.folders) {  // 对每个包含 m 的 Folder
        f->addMsg(this);        // 向该 Folder 添加一个指向本 Message 的指针
    }
}

void Message::remove_from_folders()
{
    for (auto f : folders) {    // 对 folders 中每个指针
        f->remMsg(this);        // 从该 Folder 中删除本 Message
    }
}


void swap(const Message &lhs, const Message &rhs)
{
    using std::swap;    // 在本例中严格来说并不需要,但这是一个好习惯
    // 将每个消息的指针从它（原来）所在 Folder 中删除
    for (auto f : lhs.folders) {
        f->remMsg(&lhs);
    }
    for (auto f : rhs.folders) {
        f->remMsg(&rhs);
    }
    // 交换交换 contents 和 Folder 指针 set
    swap(lhs.folders, rhs.folders);   // 使用 swap(set&, set&)
    swap(lhs.contents, rhs.contents);   // 使用 swap(string&, string&)
    // 将每个 Message 的指针添加到它的（新）Folder 中
    for (auto f : lhs.folders) {
        f->addMsg(&lhs);
    }
    for (auto f : rhs.folders) {
        f->addMsg(&rhs);
    }
}



Folder::Folder(const Folder &f) :
    msgs(f.msgs)
{
    add_to_message(f);  // 将 Folder 添加到它所有 Message 的 folders 中
}

Folder &Folder::operator =(const Folder &rhs)
{
    remove_from_msgs();
    msgs = rhs.msgs;
    add_to_message(this);
    return (this);
}

Folder::~Folder()
{
    remove_from_msgs(); // 从所有 Message 中删除本 Folder
}

void Folder::add_to_message(const Folder &f)
{
    for (auto msg : f.msgs) {
        msg->addFldr(this);
    }
}

void Folder::remove_from_msgs()
{
    while (!msgs.empty()) {
        (*msgs.begin())->remove(*this);
    }
}
